﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using CapaNegocio;
using CapaDatos;
using System.Data;

public partial class abmObra_AdministrarEtapa : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {


        if (!IsPostBack)
        {
            if (Session["UsuLogin"] == null)
            {
                Response.Redirect("../Default.aspx", true);
            }
            else
            {
                Usuario usu = ((Usuario)(Session["UsuLogin"]));
                Label1.Text = usu.Apellido + ", " + usu.Nombre + " (" + usu.Perfil.Nombre + ")";

           
                Session["herramDic"] = new Dictionary<int, int>();
                Session["obreros"] = new List<Obrero>();


                List<Herramienta> herramientas = Herramienta.buscarHerramientas();
                lstHerramientas.DataSource = herramientas;
                lstHerramientas.DataTextField = "descripcion";
                lstHerramientas.DataValueField = "codigo";
                lstHerramientas.DataBind();

                List<Obrero> obreros = Obrero.buscarObreros();
                lstObrero.DataSource = obreros;
                lstObrero.DataTextField = "textoAMostrar";
                lstObrero.DataValueField = "codigo";
                lstObrero.DataBind();


                List<Etapa> etapas = Etapa.buscarEtapas();
                lstEtapa.DataSource = etapas;
                lstEtapa.DataTextField = "descripcion";
                lstEtapa.DataValueField = "codigo";
                lstEtapa.DataBind();

                if (Session["OrdenTrabajo"] != null && ((OrdenTrabajo)Session["OrdenTrabajo"]).Codigo != 0)
                {
                    txtOT.Text = Convert.ToString(((OrdenTrabajo)Session["OrdenTrabajo"]).Codigo);
                    botonBuscarOT_Click(sender, e);
                    botonBuscarOT.Visible = false;
                    txtOT.Enabled = false;
                }

            }
  
        }
    }


    protected void botonAceptar_Click(object sender, EventArgs e)
    {
        List<Obrero> obreros = (List<Obrero>)Session["obreros"];
        Dictionary<int, int> herramientas = ((Dictionary<int, int>)Session["herramDic"]);
        OrdenTrabajo orden = (OrdenTrabajo)Session["OrdenTrabajo"];
        Etapa etapa = Etapa.buscarEtapa(Convert.ToInt32(lstEtapa.SelectedValue));


        if (DateTime.Compare(orden.FechaComienzo, Convert.ToDateTime(txtFechaInicio.Text)) == 1)
        {
            mensajeErrorFechas.Visible=true;
            mensajeErrorFechas.Text = "La fecha de comienzo de la etapa debe ser igual o mayor a la fecha de inicio del orden de trabajo estipulada.";
        }
        else if (DateTime.Compare(Convert.ToDateTime(txtFechaInicio.Text), Convert.ToDateTime(txtFechaFin.Text)) == 1)
        {
            mensajeErrorFechas.Visible = true;
            mensajeErrorFechas.Text = "La fecha de fin de la etapa: '" + etapa.Descripcion + "' debe ser igual o mayor a la fecha de inicio.";
        }
        else
        {

            int i = EtapaObra.registrarEtapa(etapa, orden, obreros, herramientas, Convert.ToDateTime(txtFechaInicio.Text), Convert.ToDateTime(txtFechaFin.Text));

            if (i > 0)
            {

                Session["ruta"] = "abmObra/AdministrarEtapa.aspx";
                Session["mensaje"] = "Se ha agregado la con: " + etapa.Descripcion;
                Response.Redirect("../Exito.aspx");

            }
            else
            {
                Session["error"] = "Se produjo un error inesperado al momento de registrar la con actual.\n";
                Session["ruta"] = "abmObra/AdministrarEtapa.aspx";
                Response.Redirect("../Error.aspx");
            }
        }
    }


    protected void botonCancelar_Click(object sender, EventArgs e)

    {
        Session["OrdenTrabajo"] = new OrdenTrabajo();
        Session["herramDic"] = new Dictionary<int, int>();
        Session["obreros"] = new List<Obrero>();
        Response.Redirect("AdministrarOrdenesAsignadas.aspx");

    }
    protected void botonAgregarObrero_Click(object sender, EventArgs e)
    {
        mensajeErrorObrero.Visible = false;
        if (lstObrero.SelectedValue != null)
        {
            Obrero obrero =
                Obrero.buscarObrero
                (Convert.ToInt32(lstObrero.SelectedValue));
            try
            {

                foreach (Obrero i in ((List<Obrero>)Session["obreros"]))
                {
                    if (i.Codigo == obrero.Codigo)
                    {
                        throw new ArgumentException();
                    }
                }

                agregarObrero(obrero);
            }
            catch (ArgumentException ex)
            {
                string mensaje = ex.Message;
                mensajeErrorObrero.Visible = true;
                mensajeErrorObrero.Text = "El obrero que intenta agregar ya existe.";
            }
        }

    }
    protected void botonQuitarObrero_Click(object sender, EventArgs e)
    {
        mensajeErrorObrero.Visible = false;
        if (obrerosAgreg.SelectedItem != null)
        {
            Obrero obrero = Obrero.buscarObrero(Convert.ToInt32(obrerosAgreg.SelectedItem.Value));

            foreach (Obrero i in ((List<Obrero>)Session["obreros"]))
            {
                if (i.Codigo == obrero.Codigo)
                {
                    ((List<Obrero>)Session["obreros"]).Remove(i);
                    obrerosAgreg.Items.Remove(obrerosAgreg.SelectedItem);
                    break;
                }
            }
        }
    }

    private void agregarObrero(Obrero obrero)
    {
        ((List<Obrero>)Session["obreros"]).Add(obrero);
        obrerosAgreg.Items.Add(new ListItem(obrero.TextoAMostrar,obrero.Codigo.ToString()));  
    }


    private void agregarHerramienta(Herramienta herramienta, string cant)
    {
        ((Dictionary<int, int>)Session["herramDic"]).Add(herramienta.Codigo, Convert.ToInt32(cant));
        herramientasAgreg.Items.Add(new ListItem(herramienta.Descripcion + "(" + cant + ")", herramienta.Codigo.ToString()));
        txtCantidad.Text = "1";
    }

    protected void botonAgregarHerramienta_Click(object sender, EventArgs e)
    {
        mensajeErrorHerram.Visible = false;

        if (lstHerramientas.SelectedValue != null)
        {
            Herramienta herramienta =
                Herramienta.buscarHerramienta
                (Convert.ToInt32(lstHerramientas.SelectedValue));
            try
            {
                agregarHerramienta(herramienta, txtCantidad.Text);
            }
            catch (ArgumentException ex)
            {
                string mensaje = ex.Message;
                mensajeErrorHerram.Visible = true;
                mensajeErrorHerram.Text = "La herramienta que intenta agregar ya existe.";
            }
        }
    }
    protected void botonQuitarHerramienta_Click(object sender, EventArgs e)
    {
        mensajeErrorHerram.Visible = false;

        if (herramientasAgreg.SelectedItem != null)
        {
            Herramienta herramienta = Herramienta.buscarHerramienta(Convert.ToInt32(herramientasAgreg.SelectedItem.Value));
           
            foreach (KeyValuePair<int, int> i in ((Dictionary<int, int>)Session["herramDic"]))
            {
                if (i.Key == herramienta.Codigo)
                {
                    ((Dictionary<int, int>)Session["herramDic"]).Remove(i.Key);
                    herramientasAgreg.Items.Remove(herramientasAgreg.SelectedItem);
                    break;
                }
            }
        }
    }
    protected void botonBuscarOT_Click(object sender, EventArgs e)
    {
        if (!String.IsNullOrEmpty(txtOT.Text))
        {
            OrdenTrabajo orden = OrdenTrabajo.buscarOrden(Convert.ToInt32(txtOT.Text));
            Session["OrdenTrabajo"] = orden;
            txtEstado.Text = orden.EstadoOT.Descripcion;
            txtFechaInicioOT.Text = orden.FechaComienzo.ToShortDateString();
       
            List<EtapaObra> etapas=  EtapaObra.buscarEtapas(orden.Codigo);

            if (etapas.Count > 0)
            {

                EtapaObra etapa = etapas.Last();
                txtFechaInicio.Enabled = false;
                lstEtapa.Enabled = false;
                refreshGrid(etapas);
                mensajeEtapas.Visible = false;
                
                //si estoy consultando la ultima con
                if (etapas.Count == 7)
                {
                    lstEtapa.SelectedValue = Convert.ToString(etapa.Codigo);
                    txtFechaInicio.Text = etapa.FechaInicio.ToShortDateString();
                    txtFechaFin.Text = etapa.FechaFin.ToShortDateString();
                    txtFechaFin.Enabled = false;
                    mensajeEtapasCompletas.Visible = true;
                    mensajeEtapasCompletas.Text = "Atención: Ya fueron agregadas las 7 etapas de esta orden de trabajo.";
                    botonAceptar.Enabled = false;
                    grdEtapas.Visible = true;
                }
                else
                {
                    if (etapa.obtenerProximaEtapa() == 7)
                    {
                        txtFechaFin.Text = etapa.FechaFin.ToShortDateString();
                    }

                    lstEtapa.SelectedValue = Convert.ToString(etapa.obtenerProximaEtapa());
                    txtFechaInicio.Text = etapa.FechaFin.ToShortDateString(); // la fecha de fin de la ultima con es el comienzo de la otra
                    mensajeEtapasCompletas.Visible = false;
                }
            }else  {

            
                    grdEtapas.Visible = false;
                    mensajeEtapas.Visible = true;
                    txtFechaInicio.Text = "";
                    txtFechaFin.Text = "";
                    mensajeEtapasCompletas.Visible = false;
                    lstEtapa.Enabled = true;
                    lstEtapa.SelectedValue = "1";
                    txtFechaInicio.Enabled = true;
                    txtFechaFin.Enabled = true;
                    
            }
        }else{

            Session["error"] = "Debe buscar una orden de trabajo para confirmar los datos de la con";
            Session["ruta"] = "abmObra/AdministrarEtapa.aspx";
            Response.Redirect("../Error.aspx");
        
        }
    }

    private void refreshGrid(List<EtapaObra> list)
    {

        DataTable dt = new DataTable();
        dt.Columns.Add("nroEtapa");
        dt.Columns.Add("fechaInicio");
        dt.Columns.Add("fechaFin");
        dt.Columns.Add("diasTot");
        DataRow dr;

        for (int i = 0; i < list.Count; i++)
        {
            EtapaObra eo = (EtapaObra)list[i];
            dr = dt.NewRow();
            dr["nroEtapa"] = eo.Etapa.Descripcion;
            dr["fechaInicio"] = eo.FechaInicio.ToShortDateString();
            dr["fechaFin"] = eo.FechaFin.ToShortDateString();
            dr["diasTot"] = eo.DiasTotalesEstipulados();
            dt.Rows.Add(dr);
        }
        grdEtapas.DataSource = dt;
        grdEtapas.DataBind();
    }

}